package repository

import (
	"github.com/TimeWtr/tinylink/interval/domain"
	"github.com/TimeWtr/tinylink/interval/repository/dao"
	"golang.org/x/net/context"
)

var _ URLRecordsRepositoryInter = (*URLRecordsRepository)(nil)

type URLRecordsRepositoryInter interface {
	Insert(ctx context.Context, url domain.URL) (domain.URL, error)
	Update(ctx context.Context, url domain.URL) (domain.URL, error)
	Delete(ctx context.Context, id int64) error
	FindByShortURL(ctx context.Context, shortUrl string) (domain.URL, error)
}

type URLRecordsRepository struct {
	d dao.URLRecordsInter
}

func NewURLRecordsRepository(d dao.URLRecordsInter) URLRecordsRepositoryInter {
	return &URLRecordsRepository{d: d}
}

func (ur *URLRecordsRepository) Insert(ctx context.Context, url domain.URL) (domain.URL, error) {
	res, err := ur.d.Insert(ctx, url)
	if err != nil {
		return domain.URL{}, err
	}

	return ur.transfer(res)
}

func (ur *URLRecordsRepository) Update(ctx context.Context, url domain.URL) (domain.URL, error) {
	res, err := ur.d.Update(ctx, url)
	if err != nil {
		return domain.URL{}, err
	}

	return ur.transfer(res)
}

func (ur *URLRecordsRepository) Delete(ctx context.Context, id int64) error {
	return ur.d.Delete(ctx, id)
}

func (ur *URLRecordsRepository) FindByShortURL(ctx context.Context, shortUrl string) (domain.URL, error) {
	res, err := ur.d.FindByShortURL(ctx, shortUrl)
	if err != nil {
		return domain.URL{}, err
	}

	return ur.transfer(res)
}

func (ur *URLRecordsRepository) transfer(res dao.URLRecords) (domain.URL, error) {
	var updateTime int64
	err := res.UpdateTime.Scan(&updateTime)
	if err != nil {
		return domain.URL{}, err
	}

	return domain.URL{
		ID:         res.ID,
		Biz:        res.Biz,
		LongURL:    res.LongURL,
		ShortURL:   res.ShortURL,
		Period:     res.Period,
		CreateTime: res.CreateTime,
		UpdateTime: updateTime,
	}, nil
}
